今天的主題是物件導向(Object-oriented programming),也簡稱 OOP,物件導向可以讓程式碼更易於管理,可以把應用程式想成有很多個物件,彼此獨立,並進行互動。
類別(Class):可以想成就是一個模型範本
還有一個叫做抽象類別(Abstract Class):抽象類別無法被實體化,只能作為父類別提供繼承或被定義介面(Interface)使用。
實例(Instance):透過類別(Class)實體化來產生一個物件實例
我自己都覺得這概念超級抽象的,不過可以想成是我今天在一個元宇宙中想要創建棒球隊,而棒球隊會有棒球員,這時候我就可以先定義一個棒球員的類別叫 Player,每個球員都會有名字及守備位置,和一句出場自我介紹的方法~
接著我們要建立第一位球員(實例)了,建立物件時, class 前方加上 new (沒有也是可以的),這時候 player1 第一位球員已經被建立了,但是還沒有給他屬性,因此可以是用 player.name
賦予球員名字,也可以呼叫 class 中的方法。
上述轉換為程式碼,如下方:
void main() {
var player1 = Player();
player1.name = 'Ichiro Suzuki';
player1.position = 'LF';
player1.sayHi();
var player2 = Player();
player2.name = 'Shohei Ohtani';
player2.position = 'Pitcher';
player2.sayHi();
}
class Player {
String name = "";
String position="";
void sayHi() => print("Hi, I'm $name, position is $position.");
}
介紹完基礎的類別和實例,再來是繼承
假設類別是爸爸,他可以有兒子(而且可以有多個兒子),而兒子可以繼承老爸的屬性與方法等,也可以取代老爸的傳統思維。
下方例子,我們建立一個 Person 的類別做為父類別,接著我們再創建一個子類別 Student ,使用 extends 繼承於父類別,可以使用父類別的屬性和方法,也可以呼叫自己的方法。
void main() {
var student = Student();
student.name = 'Bob';
student.age = 12;
student.sayHi();
student.study();
}
class Person {
String name = '';
int age = 0;
void sayHi() => print("Hi, I'm $name. I'm $age.");
}
class Student extends Person {
void study() => print("Hi, I'm $name. I want to go to school.");
}
特別的 Mixin
Dart 在類別上有個特別的 Mixin 可使用,有點像是可以讓其他人共用方法但不須使用繼承的方式來共用,直接看例子好了!
我們不繼承 Quarantine 的類別,但可以借用他的方法,將 class 改成 mixin
,其他寫法一樣,宣告一個新的 class 為 Manager 繼承 Employee 後再加上 with
,這時我們產生一個 manager 除了可以繼承 Employee 的屬性與方法外,也可以使用 Quarantine 的囉~
void main() {
var manager = Manager();
manager.name = 'Alice';
manager.temp = 36.5;
manager.clockIn();
manager.takeTemperature();
}
class Employee {
var name = '';
void clockIn() => print('$name clock in');
}
mixin Quarantine {
double temp = 30;
void takeTemperature() => print('temperature: $temp');
}
class Manager extends Employee with Quarantine {}
一起到 DartPad 試試吧~
關於物件導向相關的概念與實作,我自己本身並沒有很熟悉,所以寫的沒有很深入,但這些在 flutter 中又很常見(不得不會)所以還是硬著頭皮寫了今天的內容,如果有大大發現錯誤的地方,歡迎留言指教~
OK~我們明天見!